/*
 * Contribuição do leitor Alex Cançado.
 */
package abrindoojogo.exemplos.gameloop;

class JogoFramePulsoFixo extends JogoLoopSimples
{
    long FRAME_DESEJADOS_POR_SEGUNDO = 26;
    double NANOS_ESPERADOS_POR_FRAME = Contador.NANOS_EM_UM_SEGUNDO / FRAME_DESEJADOS_POR_SEGUNDO;
    long PULSOS_DESEJADOS_POR_SEGUNDO = 60;
    double NANOS_ESPERADOS_POR_PULSO = Contador.NANOS_EM_UM_SEGUNDO / PULSOS_DESEJADOS_POR_SEGUNDO;

    @Override
    public void gameloop()
    {
	initialize();
	long nanoTimeDoProximoFrame = System.nanoTime();
	long nanoTimeDoProximoPulso = nanoTimeDoProximoFrame;
	while (true)
	{
	    Thread.yield();

	    int c = 0;
	    while (System.nanoTime() > nanoTimeDoProximoPulso && (c++ < 5))
	    {
		{
		    update();
		    contador.sleep(100);
		    nanoTimeDoProximoPulso += NANOS_ESPERADOS_POR_PULSO;
		}
	    }

	    if (System.nanoTime() > nanoTimeDoProximoFrame)
	    {
		render();
		nanoTimeDoProximoFrame += NANOS_ESPERADOS_POR_FRAME;
	    }

	}
    }
}
